//
//  main.m
//  C8_指针
//
//  Created by dllo on 15/10/15.
//  Copyright (c) 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "zhizhen.h"
// 指针作为数组参数
void test(int *p)
{

    printf("%d\n", *p);
    *p = 5;

}












int main(int argc, const char * argv[]) {

//    int a = 0;
//    printf("%d\n", a);
//    printf("%p\n", &a);
    
    // 定义一个指针类型的变量
    // 变量类型 变量名 初值
//    int *p = NULL;
    
    // 指针基础使用最重要的两个符号: * &
    // * - 取值运算符
    // & - 取址运算符
    
//    int a = 5;
    
    // 通过指针访问
    // 指针指向空间 - 本质就是指针的空间存了a的地址值
//    p = &a;
    
    // 通过指针访问所指向空间中的元素值
//    printf("%d\n", *p);
    
    
    // float 型变量只能比较大小不能比较是否相等,因为float类型实际是无限趋向指定的数.
//    float b = 9.9;
//    float *q = NULL;
//    q = &b;
//    printf("%.2f\n", *q);
    
    
//    int a = 3;
//    int b = 5;
//    int *p = NULL;
//    int *q = NULL;
//    p =&a;
//    q = &b;
//    int temp = *p;
//    *p = *q;
//    *q = temp;
//    printf("%d\n", a);
//    printf("%d\n", b);
    
//    int a = 1, b = 6, c = 3;
//    int *p = NULL, *q = NULL, *i = NULL;
//    p = &a;
//    q = &b;
//    i = &c;
//    int max = *p > *q ? *p : *q;
//    max = max > *i ? max : *i;
//    printf("%d\n", max);
    
    int a = 0;
    int b = a;
    printf("b1 = %d\n", b);
    scanf("%d", &a);
    printf("b1 = %d\n", b);
    
    
//    int a = 0;
//    int *p = NULL;
//    p = &a;
//    printf("p1 = %d\n", *p);
//    scanf("%d", &a);
//    printf("p2 = %d\n", *p);
    
    // 不同类型指针占内存大小相同,64位系统下都占8字节
//    int *p = NULL;
//    char *q = NULL;
//    
//    printf("%ld\n", sizeof(p));
//    printf("%ld\n", sizeof(q));
    
    
    // 不同类型指针的意义
    // 1. *p所见范围不同
    // 2. p++移动大小不同
//    int a = 256;
//    char *p = &a;
//    
//    p++;
//    
//    printf("%d\n", *p);
    
    // 指针与数组
//    int a[5] = {1, 2, 3, 4, 5};
//    int *p = NULL;
//    
//    // 指针指向数组首地址
//    p = a;
//    p = &a[0];
//    
//    // 指向数组中的其他元素
//    p++;
//    printf("%d\n", *p);
//    
//    
//    printf("%d\n", p[1]);
//    printf("%d\n", *(p + 1));
//    printf("%d\n", *(a + 1));
    
    // 练习, 通过指针对数组进行冒泡排序
    
    
    // 语法糖 : a[1] = *(a + 1) = *(p + 1) = p[1];
    // 系统存数组是存地址加偏移量
    
//    int a[7] = {4, 2, 5, 3, 7, 9, 10};
//    int *p = a;
//    for (int i = 0; i < 7 - 1; i++) {
//        for (int j = 0; j < 7 - i - 1; j++) {
//            if (*(p + j) > p[j + 1]) {
//                int temp = p[j];
//                *(p + j) = *(p + j + 1);
//                p[j + 1] = temp;
//            }
//        }
//    }
//    for (int i = 0; i < 7; i++) {
//        printf("%d ", *(p + i));
//    }
    
    
    // 通过指针可以计算字符串的长度.
    // 编程实现.
    // 提示: 遇到'\0'表示字符串结束.
    
//    char str[] = "qwerqwerqwer";
//    char *p = str;
//    int cont = 0;
//    
//    while (*p++ != '\0') {
//        cont++;
//    }
//
//    // 遇到\0退出循环
////    while (*p != '\0') {
////        // 计数加一
////        cont++;
////        // 指针移动访问后一个元素
////        p++;
////    }
//    printf("%d\n", cont);
    
//    int a = 3;
//    test(&a);
//    printf("%d\n", a);
    
    
//    int a[7] = {4, 2, 5, 3, 7, 9, 10};
//    maopao(a, 7);
//    
//    int *p[10] = {NULL};
    
    
    
    return 0;
}
